Lambdaの「Blueprint」で簡単にSlackとCloudWatchを連携してみた(2017年版)
まいど、大阪の市田です。 CloudWatchのアラームをSlackに通知するという構成は、最近ではよくある話でその方法もたくさんあります。 今回は、ゼロからLambda関数を作るのではなく、事前に用意されている「Blueprint」を使います。
このBlueprintは昨年から公開されていますが、Blueprintの内容は随時アップデートされており、現在はKMSを使って、SlackにPOSTするURLを暗号化しています。 その設定もマネジメントコンソール上で簡単にできるようになっていたので、最新内容を踏まえてご紹介したいと思います。
概要
今回利用するBlueprintは「Cloudwatch-alarm-to-slack」 です。 構成は下記の通りで、「CloudWatchのアラームをAmazon SNSに送り、Lambdaを起動する」という形になります。
- SlackのWebhookの準備
- KMSの準備(暗号化キーの作成)
- Lambda Functionの作成
- IAM RoleのPolicy追加
- Webhook URLの暗号化
- Webhook URLの復号化設定(IAM Role)
- CloudWatchアラームの作成
- 動作確認
やってみる
それでは実際の内容を見ていきたいと思います。
SlackのWebhookの準備
まず、Slackのアカウントがなければ作成して下さい。作成できたらhttps://[team名].slack.com/services/new
にアクセスします。
ページ上部にある検索窓に「Incoming WebHooks」と入力して検索すると、検索窓の下に候補が出てくるのでこれをクリックして下さい。
次の画面で「Add Configuration」をクリックします。
通知をPOSTしたいChannelを指定します。既存のものから選択するか新規に作成して下さい。今回は「#cloudwatch」というChannelにしました。 Channleの指定ができれば、緑色の「Add incoming WebHooks integration」をクリックします。
最後のページで「Webhook URL」が表示されるので、コピーして控えておきましょう。Lambda Functionの作成時に必要になります。
後は好みでアイコンなどを設定して「Save Settings」をクリックして保存します。
KMSの準備(暗号化キーの作成)
次にWebhook URLを暗号化するキーを作成します。環境に合わせて対象のリージョンを選択して、キーを作成して下さい。 後は全てデフォルトで作成しました。
Lambda Functionの作成
ようやくLambda Functionの作成です。Blueprintの選択時に「slack」で検索すると「Cloudwatch-alarm-to-slack」が3種類出てきます。 利用言語が異なるだけなので使いやすいものを選択して下さい。今回はPython2.7のものを選択しました。
SNSとの連携になるので対象となる「SNS Topic」を選択して下さい。「Enable trigger」にチェックを入れて「Next」をクリックします。
Lambda関数のコード自体はBlueprintで用意されているので、コードの部分はそのままにしておきます。作業が必要になるのは環境変数の設定です。
Blueprintで用意されているコードでは「通知をPOSTするSlackのチャンネル名」と「Webhook URL」を環境変数としています。 この内、「Webhook URL」を暗号化するので、まず「Enable encryption helpers」 にチェックを入れます。
次に暗号化に使う暗号化キー(Encryption key)を選択します。これは先程作成した暗号化キーを選択します。
環境変数は次のように設定します。
- slackChannel:通知をPOSTするSlack Channnel (今回は「#cloudwatch」チャンネルの指定。)
- kmsEncryptedHookUrl:hooks.stack.com/service/xxxxxxxx
- 「https://」 のプロトコルの部分を除外したものを指定します。
設定できたら「kmsEncryptedHookUrl」 を「Encrypt」 ボタンで暗号化します。
KMSによって「Webhook URL」が暗号化されました。
次にLambda関数で利用するためのIAM Roleの作成です。今回は新規に作成しました。
Role名は適宜付けて下さい。ポリシーの編集には「Edit」をクリックします。 暗号化した「Webhook URL」を復号化する為に、ARNの指定は先程作成したKMSのものを指定しましょう。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "" ] } ] }
レビューで問題なければ「Create function」で作成します。
動作確認
これで準備ができたので、実際にCloudWatchでアラームを飛ばしてみます。CloudWatchのアラーム通知はLambda関数で指定したSNSトピックに飛ぶようにしましょう。 CPU使用率で監視しているので、閾値を「0以上」等にしてわざとアラーム状態にします。
こんな感じで「#cloudwatch」のChannelにアラームがpostされました。Saas系の連携サービスを使うと通知までに時間がかかる場合がありますが、監視間隔のタイミングで通知されるのは嬉しいですね。
最後に
Lambdaには多くのBlueprintが用意されています。既存のBlueprintもAWSの各種リリースに合わせてアップデートされるので、是非チェックしてみて下さい。
以上です。